#include<bits/stdc++.h>
#define int long long
#define M 147744151
using namespace std;
int n,m,P,q,ans,a[1005][1005],sum[1005][1005],t1,t2,s1,s2,s3,s4,prime[100005],cnt,b[1005][1005][10],LG[10][1000005];
bitset<100005> v;
struct ok{
	int d,z;
};
vector<ok> e;
char buf[(1<<21)+5],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}
inline int js(int d1,int d2,int d3,int d4,int p){
	return b[d3][d4][p]-b[d3][d2-1][p]-b[d1-1][d4][p]+b[d1-1][d2-1][p];
}
int exgcd(int x,int y){
    if(!y){
        t1=1;t2=0;
        return x;
    }
    else{
        int d=exgcd(y,x%y);
        int d1=t1,d2=t2;
        t1=d2;
        t2=d1-(x/y)*d2;
        return d;
    }
}
signed main(){
	freopen("tsuki.in","r",stdin);
	freopen("tsuki.out","w",stdout);
	for(int i=2;i<=100000;i++){
		if(!v[i]){
			prime[++cnt]=i;
			for(int j=i+i;j<=100000;j+=i) v[j]=1;
		}
	}
	n=read(),m=read(),P=read();
	int t=P;
	if(t>100000||v[t]){
		for(int i=1;i<=cnt;i++){
			int tot=0;
			while(!(t%prime[i])) t/=prime[i],tot++;
			if(tot>0) e.push_back((ok){prime[i],tot});
		}
		if(t>1) e.push_back((ok){t,(int)1});
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=read();
			for(int g=0;g<(int)e.size();g++){
				while(!(a[i][j]%e[g].d)) a[i][j]/=e[g].d,b[i][j][g]++;
			}
			sum[i][j]=a[i][j];
		}
	}
	for(int i=0;i<=max(n,m);i++) sum[0][i]=sum[i][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			sum[i][j]=(sum[i][j-1]*sum[i][j])%P;
			for(int g=0;g<(int)e.size();g++) b[i][j][g]+=b[i][j-1][g];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			sum[i][j]=(sum[i-1][j]*sum[i][j])%P;
			for(int g=0;g<(int)e.size();g++) b[i][j][g]+=b[i-1][j][g];
		}
	}
	for(int i=0;i<(int)e.size();i++){
		LG[i][0]=1;
		for(int j=1;j<=(n*m);j++) LG[i][j]=(LG[i][j-1]*e[i].d)%P;
	}
	q=read();
	for(int i=1;i<=q;i++){
		s1=read(),s2=read(),s3=read(),s4=read();
		bool flag=1;int w=1;
		for(int j=0;j<(int)e.size();j++){
			int d=js(s1,s2,s3,s4,j);
			if(d<e[j].z) flag=0;
			w=(w*LG[j][d])%P;
		}
		if(e.empty()) flag=0;
		if(flag) w=0;
		int w1=sum[s3][s4],w2=sum[s3][s2-1],w3=sum[s1-1][s4],w4=sum[s1-1][s2-1],o=0;
		o=exgcd(w2,P);
		w2=((t1%P)+P)%P;
		o=exgcd(w3,P);
		w3=((t1%P)+P)%P;
		w1=(w1*w2)%P;
		w1=(w1*w3)%P;
		w1=(w1*w4)%P;
		w1=(w1*w)%P;
		ans=(ans+((i^w1)%M))%M;
	}
	cout<<ans;
	return 0;
}

